home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 335_03 / as8051.y < prev    next >
Text File  |  1990-12-02  |  40KB  |  1,680 lines

  1. %{
  2.  
  3. /*
  4. HEADER:     ;
  5. TITLE:         Frankenstein Cross Assemblers;
  6. VERSION:     2.0;
  7. DESCRIPTION: "    Reconfigurable Cross-assembler producing Intel (TM)
  8.         Hex format object records.  ";
  9. KEYWORDS:     cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 
  10.         6811, tms7000, 8048, 8051, 8096, z8, z80;
  11. SYSTEM:     UNIX, MS-Dos ;
  12. FILENAME:     as8051.y;
  13. WARNINGS:     "This software is in the public domain.  
  14.         Any prior copyright claims are relinquished.  
  15.  
  16.         This software is distributed with no warranty whatever.  
  17.         The author takes no responsibility for the consequences 
  18.         of its use.
  19.  
  20.         Yacc (or Bison) required to compile."  ;
  21. SEE-ALSO:     as8051.doc,frasmain.c;    
  22. AUTHORS:     Mark Zenier;
  23. COMPILERS:     Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285)
  24.         (previous versions Xenix, Unisoft 68000 Version 7, Sun 3);
  25. */
  26. /* 8051 structured generation file */
  27. /* November 17, 1990 */
  28.  
  29. /*
  30.     description    frame work parser description for framework cross
  31.             assemblers
  32.     history        February 2, 1988
  33.             September 11, 1990 - merge table definition
  34.             September 12, 1990 - short file names
  35.             September 14, 1990 - short variable names
  36.             September 17, 1990 - use yylex as external
  37. */
  38. #include <stdio.h>
  39. #include "frasmdat.h"
  40. #include "fragcon.h"
  41.  
  42. #define yylex lexintercept
  43.  
  44. /*    0000.0000.0000.0xxx   register value */
  45. #define REGVALMASK    0x7
  46. /*    0xxx.xxxx.0000.0000    register and special select bits */
  47. #define REGSEL_ALL    0x7f00
  48. #define REG2NDSHFT    8
  49. #define REGSEL_ACC    0x100
  50. #define REGSEL_AB    0x200
  51. #define REGSEL_C    0x400
  52. #define REGSEL_DPTR    0x800
  53. #define REGSEL_PC    0x1000
  54. #define REGSEL_R01    0x2000
  55. #define REGSEL_R07    0x4000
  56. #define REG2SEL_ACC    0x1
  57. #define REG2SEL_AB    0x2
  58. #define REG2SEL_C    0x4
  59. #define REG2SEL_DPTR    0x8
  60. #define REG2SEL_PC    0x10
  61. #define REG2SEL_R01    0x20
  62. #define REG2SEL_R07    0x40
  63. #define ST_INH 0x1
  64. #define ST_UOP01 0x2
  65. #define ST_UOP02 0x4
  66. #define ST_UOP03 0x8
  67. #define ST_UOP04 0x10
  68. #define ST_UOP05 0x20
  69. #define ST_ALU01 0x1
  70. #define ST_ALU02 0x2
  71. #define ST_ALU02E 0x4
  72. #define ST_ALU03 0x8
  73. #define ST_ALU04 0x10
  74. #define ST_ALU05 0x20
  75. #define ST_ALU06 0x40
  76. #define ST_ALU07 0x80
  77. #define ST_ALU08 0x100
  78. #define ST_ALU09 0x200
  79. #define ST_ALU10 0x400
  80. #define ST_MOV01 0x1
  81. #define ST_MOV02 0x2
  82. #define ST_MOV03 0x4
  83. #define ST_MOV04 0x8
  84. #define ST_MOV05 0x10
  85. #define ST_MOV06 0x20
  86. #define ST_MOV07 0x40
  87. #define ST_MOV08 0x80
  88. #define ST_MOV09 0x100
  89. #define ST_MOV10 0x200
  90. #define ST_MOV11 0x400
  91. #define ST_MOV12 0x800
  92. #define ST_MOV13 0x1000
  93. #define ST_MOV14 0x2000
  94. #define ST_CJNE1 0x1
  95. #define ST_CJNE2 0x2
  96. #define ST_CJNE3 0x4
  97.     
  98.     static char    genbdef[] = "[1=];";
  99.     static char    genwdef[] = "[1=]y"; /* x for normal, y for byte rev */
  100.     char ignosyn[] = "[Xinvalid syntax for instruction";
  101.     char ignosel[] = "[Xinvalid operands";
  102.  
  103.     long    labelloc;
  104.     static int satsub;
  105.     int    ifstkpt = 0;
  106.     int    fraifskip = FALSE;
  107.  
  108.     struct symel * endsymbol = SYMNULL;
  109.  
  110. %}
  111. %union {
  112.     int    intv;
  113.     long     longv;
  114.     char    *strng;
  115.     struct symel *symb;
  116. }
  117.  
  118. %token <intv> REG
  119. %type <intv> bit
  120. %token <intv> KOC_BDEF
  121. %token <intv> KOC_ELSE
  122. %token <intv> KOC_END
  123. %token <intv> KOC_ENDI
  124. %token <intv> KOC_EQU
  125. %token <intv> KOC_IF
  126. %token <intv> KOC_INCLUDE
  127. %token <intv> KOC_ORG
  128. %token <intv> KOC_RESM
  129. %token <intv> KOC_SDEF
  130. %token <intv> KOC_SET
  131. %token <intv> KOC_WDEF
  132. %token <intv> KOC_CHSET
  133. %token <intv> KOC_CHDEF
  134. %token <intv> KOC_CHUSE
  135. %token <intv> KOC_opcode
  136. %token <intv> KOC_aluop
  137. %token <intv> KOC_mov
  138. %token <intv> KOC_cjne
  139.  
  140. %token <longv> CONSTANT
  141. %token EOL
  142. %token KEOP_AND
  143. %token KEOP_DEFINED
  144. %token KEOP_EQ
  145. %token KEOP_GE
  146. %token KEOP_GT
  147. %token KEOP_HIGH
  148. %token KEOP_LE
  149. %token KEOP_LOW
  150. %token KEOP_LT
  151. %token KEOP_MOD
  152. %token KEOP_MUN
  153. %token KEOP_NE
  154. %token KEOP_NOT
  155. %token KEOP_OR
  156. %token KEOP_SHL
  157. %token KEOP_SHR
  158. %token KEOP_XOR
  159. %token KEOP_locctr
  160. %token <symb> LABEL
  161. %token <strng> STRING
  162. %token <symb> SYMBOL
  163.  
  164. %token KTK_invalid
  165.  
  166. %right    KEOP_HIGH KEOP_LOW
  167. %left    KEOP_OR KEOP_XOR
  168. %left    KEOP_AND
  169. %right    KEOP_NOT
  170. %nonassoc    KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ
  171. %left    '+' '-'
  172. %left    '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR
  173. %right    KEOP_MUN
  174.  
  175.  
  176. %type <intv> expr exprlist stringlist
  177.  
  178. %start file
  179.  
  180. %%
  181.  
  182. file    :    file allline
  183.     |    allline
  184.     ;
  185.  
  186. allline    :     line EOL
  187.             {
  188.                 clrexpr();
  189.             }
  190.     |    EOL
  191.     |    error EOL
  192.             {
  193.                 clrexpr();
  194.                 yyerrok;
  195.             }
  196.     ;
  197.  
  198. line    :    LABEL KOC_END 
  199.             {
  200.                 endsymbol = $1;
  201.                 nextreadact = Nra_end;
  202.             }
  203.     |          KOC_END 
  204.             {
  205.                 nextreadact = Nra_end;
  206.             }
  207.     |    KOC_INCLUDE STRING
  208.             {
  209.         if(nextfstk >= FILESTKDPTH)
  210.         {
  211.             fraerror("include file nesting limit exceeded");
  212.         }
  213.         else
  214.         {
  215.             infilestk[nextfstk].fnm = savestring($2,strlen($2));
  216.             if( (infilestk[nextfstk].fpt = fopen($2,"r"))
  217.                 ==(FILE *)NULL )
  218.             {
  219.                 fraerror("cannot open include file");
  220.             }
  221.             else
  222.             {
  223.                 nextreadact = Nra_new;
  224.             }
  225.         }
  226.             }
  227.     |    LABEL KOC_EQU expr 
  228.             {
  229.                 if($1 -> seg == SSG_UNDEF)
  230.                 {
  231.                     pevalexpr(0, $3);
  232.                     if(evalr[0].seg == SSG_ABS)
  233.                     {
  234.                         $1 -> seg = SSG_EQU;
  235.                         $1 -> value = evalr[0].value;
  236.                         prtequvalue("C: 0x%lx\n",
  237.                             evalr[0].value);
  238.                     }
  239.                     else
  240.                     {
  241.                         fraerror(
  242.                     "noncomputable expression for EQU");
  243.                     }
  244.                 }
  245.                 else
  246.                 {
  247.                     fraerror(
  248.                 "cannot change symbol value with EQU");
  249.                 }
  250.             }
  251.     |    LABEL KOC_SET expr 
  252.             {
  253.                 if($1 -> seg == SSG_UNDEF
  254.                    || $1 -> seg == SSG_SET)
  255.                 {
  256.                     pevalexpr(0, $3);
  257.                     if(evalr[0].seg == SSG_ABS)
  258.                     {
  259.                         $1 -> seg = SSG_SET;
  260.                         $1 -> value = evalr[0].value;
  261.                         prtequvalue("C: 0x%lx\n",
  262.                             evalr[0].value);
  263.                     }
  264.                     else
  265.                     {
  266.                         fraerror(
  267.                     "noncomputable expression for SET");
  268.                     }
  269.                 }
  270.                 else
  271.                 {
  272.                     fraerror(
  273.                 "cannot change symbol value with SET");
  274.                 }
  275.             }
  276.     |    KOC_IF expr 
  277.             {
  278.         if((++ifstkpt) < IFSTKDEPTH)
  279.         {
  280.             pevalexpr(0, $2);
  281.             if(evalr[0].seg == SSG_ABS)
  282.             {
  283.                 if(evalr[0].value != 0)
  284.                 {
  285.                     elseifstk[ifstkpt] = If_Skip;
  286.                     endifstk[ifstkpt] = If_Active;
  287.                 }
  288.                 else
  289.                 {
  290.                     fraifskip = TRUE;
  291.                     elseifstk[ifstkpt] = If_Active;
  292.                     endifstk[ifstkpt] = If_Active;
  293.                 }
  294.             }
  295.             else
  296.             {
  297.                 fraifskip = TRUE;
  298.                 elseifstk[ifstkpt] = If_Active;
  299.                 endifstk[ifstkpt] = If_Active;
  300.             }
  301.         }
  302.         else
  303.         {
  304.             fraerror("IF stack overflow");
  305.         }
  306.             }
  307.                         
  308.     |    KOC_IF 
  309.             {
  310.         if(fraifskip) 
  311.         {
  312.             if((++ifstkpt) < IFSTKDEPTH)
  313.             {
  314.                     elseifstk[ifstkpt] = If_Skip;
  315.                     endifstk[ifstkpt] = If_Skip;
  316.             }
  317.             else
  318.             {
  319.                 fraerror("IF stack overflow");
  320.             }
  321.         }
  322.         else
  323.         {
  324.             yyerror("syntax error");
  325.             YYERROR;
  326.         }
  327.                 }
  328.                         
  329.     |    KOC_ELSE 
  330.             {
  331.                 switch(elseifstk[ifstkpt])
  332.                 {
  333.                 case If_Active:
  334.                     fraifskip = FALSE;
  335.                     break;
  336.                 
  337.                 case If_Skip:
  338.                     fraifskip = TRUE;
  339.                     break;
  340.                 
  341.                 case If_Err:
  342.                     fraerror("ELSE with no matching if");
  343.                     break;
  344.                 }
  345.             }
  346.  
  347.     |    KOC_ENDI 
  348.             {
  349.                 switch(endifstk[ifstkpt])
  350.                 {
  351.                 case If_Active:
  352.                     fraifskip = FALSE;
  353.                     ifstkpt--;
  354.                     break;
  355.                 
  356.                 case If_Skip:
  357.                     fraifskip = TRUE;
  358.                     ifstkpt--;
  359.                     break;
  360.                 
  361.                 case If_Err:
  362.                     fraerror("ENDI with no matching if");
  363.                     break;
  364.                 }
  365.             }
  366.     |    LABEL KOC_ORG expr 
  367.             {
  368.                 pevalexpr(0, $3);
  369.                 if(evalr[0].seg == SSG_ABS)
  370.                 {
  371.                     locctr = labelloc = evalr[0].value;
  372.                     if($1 -> seg == SSG_UNDEF)
  373.                     {
  374.                         $1 -> seg = SSG_ABS;
  375.                         $1 -> value = labelloc;
  376.                     }
  377.                     else
  378.                         fraerror(
  379.                         "multiple definition of label");
  380.                     prtequvalue("C: 0x%lx\n",
  381.                         evalr[0].value);
  382.                 }
  383.                 else
  384.                 {
  385.                     fraerror(
  386.                      "noncomputable expression for ORG");
  387.                 }
  388.             }
  389.     |          KOC_ORG expr 
  390.             {
  391.                 pevalexpr(0, $2);
  392.                 if(evalr[0].seg == SSG_ABS)
  393.                 {
  394.                     locctr = labelloc = evalr[0].value;
  395.                     prtequvalue("C: 0x%lx\n",
  396.                         evalr[0].value);
  397.                 }
  398.                 else
  399.                 {
  400.                     fraerror(
  401.                      "noncomputable expression for ORG");
  402.                 }
  403.             }
  404.     |    LABEL KOC_CHSET
  405.             {
  406.                 if($1 -> seg == SSG_UNDEF)
  407.                 {
  408.                     $1 -> seg = SSG_EQU;
  409.                     if( ($1->value = chtcreate()) <= 0)
  410.                     {
  411.         fraerror( "cannot c